package net.interest.curation;

import java.io.IOException;
import java.util.logging.Logger;

import net.interest.curation.meta.TwitterUserMeta;
import net.interest.curation.model.TwitterList;
import net.interest.curation.model.TwitterUser;
import net.interest.curation.model.User;
import net.interest.curation.service.TwtService;

import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;

import scenic3.ScenicPage;
import scenic3.annotation.ActionPath;
import scenic3.annotation.Default;
import scenic3.annotation.Page;
import scenic3.annotation.Var;
import twitter4j.PagableResponseList;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.TwitterException;
import twitter4j.UserList;

@Page("/twt")
public class TwtPage extends ScenicPage {
    private static final Logger log =
            Logger.getLogger(TwtPage.class.getName());
    private TwtService service = new TwtService();
    
    @Default
    public Navigation index() {
        if (!isTwtOauthExist()) {
            return redirect("/auth/login/twt");
        }
        return redirect("/");
    }

    @Deprecated
    @ActionPath("oauth")
    public Navigation oauth() {
      String authorizeURL = service.getAuthorizeUrl(request, "callback");
      
      if (authorizeURL != null) {
          try {
            // TODO 初回アクセス時、twitterにリダイレクトされるURLにjsessionidを
            // 表示させないようにダミーのレスポンスを送信し、クッキーを返す。
            // → クッキーが確認できるとjsessionidを付与しないので
            // かなり強引な手法なので、要再考
            response.sendRedirect(authorizeURL);
        } catch (IOException e) {
            // do nothing
        }
          return redirect(authorizeURL); 
      }
      else {
          return forward("/twt/list.jsp");
      }
    }

    @Deprecated
    @ActionPath("callback")
    public Navigation callback() {
        String nextUrl = service.callBack(request);
        return forward(nextUrl); 
    }
    
    @ActionPath("getList")
    public Navigation getList() {
        
        TwitterList[] lists = service.getUserTimeLineList(request);
        try {
            // ユーザタイムラインをJSONで出力します　 
            service.writeUserTimeLineList(response, lists);
        } catch (IOException e) {
            log.severe(e.getMessage());
        }
        return null;
    }
    
    @ActionPath("userList")
    public Navigation getUserList() {
        
        try {
            PagableResponseList<UserList> userList = service.getUserList(request);
            // ユーザリストをJSONで出力します　 
            service.writeUserList(response, userList);
        } catch (IOException e) {
            log.severe(e.getMessage());
        } catch (TwitterException e) {
            log.severe(e.getMessage());
        }
        return null;
    }
    
    @ActionPath("userListStatus/{listId}")
    public Navigation getUserListStatus(@Var("listId") int listId) {
        
        try {
            ResponseList<Status> userListStatus = service.getUsetListStatus(request, listId);
            // ユーザリストをJSONで出力します　 
            service.writeUserList(response, userListStatus);
        } catch (IOException e) {
            log.severe(e.getMessage());
        } catch (TwitterException e) {
            log.severe(e.getMessage());
        } 
        return null;
    }
    
    private boolean isTwtOauthExist() {

        User user = (User) request.getSession().getAttribute(User.SESSION_USER_ATTR_NAME);
        if (user == null) {
            return false;
        }
        else {
            TwitterUser twitterUser = null;
            TwitterUserMeta meta = TwitterUserMeta.get();
            twitterUser = Datastore.query(meta).filter(meta.userRef.equal(user.getKey())).asSingle();
            if (twitterUser == null) {
                return false;
            }
        }
        return true;
    }
}
